一、应用内通信
1、启动Service并传递数据
启动一个Service并且向该Service传递数据:
MyService接收数据:
2、绑定Service进行通信——>
与被绑定的Service进行通信,首先自定义一个Binder的实现类,拥有setData(String data)方法,并在onBind方法中返回自定义类的对象:
在ServiceConnection实现类中onServiceConnected方法里获取服务绑定成功时返回的对象
然后MainActivity就可以实时的想MyService同步数据了:
输出日志
3、绑定Service进行通信<——
侦听被绑定的Service的内部状态,需要借助回调接口。首先定义回调接口并设置set(callBack)方法:
自定义类MyBinder中增加一个方法,返回当前Service的对象,以便于外部客户端调用set(callBack)方法
在Service中将状态信息通过回调接口通知外界
ServiceConnection的实现类(此处为MainActivity)在onServiceConnected方法中获取Service对象,并将自定义的回调接口告知Service:
借助Handler,将数据同步到TextView上:
二、跨应用通信——AIDL
1、跨应用启动Service
从Android5.0以后,只能通过显示Intent来启动服务。
2、跨应用绑定Service
新建AIDL文件:New -> AIDL -> AIDL File -> IAppServiceRemoteBinder.aidl
在Service里实现该接口:
在第一个应用中绑定服务和解除绑定服务:
3、跨应用绑定Service并通信
在IAppServiceRemoteBinder接口中新增setData方法
其子类需要实现该方法
在第一个应用里创同样的IAppServiceRemoteBinder.aidl文件,注意包名也要一致。
- firstApp -> New -> Folder -> AIDL Folder
- aidl -> New -> Package -> com.xianxiaotao.secondapp -> OK
- 在该文件夹里创建同样的IAppServiceRemoteBinder.aidl文件,测试时可以直接复制粘贴。
上述操作执行完毕后,该应用绑定secondapp的AppService时,可以获取到IBinder的实例了。1234567891011121314151617private IAppServiceRemoteBinder binder = null;@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 此处不能用强制类型转换,虽然类名相同,但两个类在内存中地址不一样binder = IAppServiceRemoteBinder.Stub.asInterface(service);}...if (binder != null) {try {binder.setData(mEditText.getText().toString().trim());} catch (RemoteException e) {e.printStackTrace();}}